package com.zjsru.oneDay202209;

import java.util.Arrays;

/**
 * @Author: likew
 * @Date: 2022/9/14
 *  删除某些元素后的数组均值
 *  给你一个整数数组 arr ，请你删除最小 5% 的数字和最大 5% 的数字后，剩余数字的平均值。
 * 与 标准答案 误差在 10-5 的结果都被视为正确结果。
 *
 * 输入：arr = [1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3]
 * 输出：2.00000
 * 解释：删除数组中最大和最小的元素后，所有元素都等于 2，所以平均值为 2 。
 *
 * 输入：arr = [6,0,7,0,7,5,7,8,3,4,0,7,8,1,6,8,1,1,2,4,8,1,9,5,4,3,8,5,10,8,6,6,1,0,6,10,8,2,3,4]
 * 输出：4.77778
 *
 */
public class TrimMean {
    
    /**
     * 数据模拟，只注意开始的删除的数组下标即可
     * */
    public double trimMean(int[] arr) {
        int len = arr.length;
        int cnt = len * 5 / 100;
        Arrays.sort(arr);
        int[] nums = new int[len - cnt - cnt];
        for (int i = cnt, j = 0; j < len - cnt - cnt; j++) {
            nums[j] = arr[i];
            i++;
        }
        double sum = Arrays.stream(nums).sum();
        return sum / nums.length;
    }
    
    /**
     * 模拟，即上一个方法的优化版本,执行用时更快
     * */
    public double trimMean2(int[] arr) {
        Arrays.sort(arr);
        int len = arr.length;
        int total = 0;
        for (int i = len / 20; i < len - len / 20; i++) {
            total += arr[i];
        }
        return (total * 1.0) / (len * 0.9);
    }
    
    public static void main(String[] args) {
        TrimMean trimMean = new TrimMean();
        int[] arr = new int[]{1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3};
        System.out.println(trimMean.trimMean2(arr));
    }
}
